package com.example.juc.big_talk_concurrent.chapter2.article6;

public class Test {
    public static void main(String[] args) {




    }

    /**
     * synchronized 修饰普通方法，锁就是当前实例对象 res。
     *
     * 所以我们这段简单的三个字符串拼接的代码在 JDK1.5 之前其实是涉及同步的。
     *
     * 不过，在虚拟机观察变量 res 经过逃逸分析后，发现它的动态作用域被限制在 test() 方法内部，不同的线程同时调用 test() 方法时，都会创建不同的 res 对象。也就是说 res 的所有引用都永远不会逃逸到本线程的 test() 方法之外，其他线程都无法访问到它。所以虽然这里有锁，但是不存在锁竞争问题，这个锁可以被安全地消除掉。
     *
     * 显然，“锁消除” 可以节省毫无意义的请求锁时间。
     *
     * 不过，需要注意的是，在解释执行的时候这里仍然会加锁，但在经过服务端编译器的即时编译之后，这段代码就会忽略所有的同步措施而直接执行。
     *
     * @param s1
     * @param s2
     * @param s3
     * @return
     */
    public String test (String s1, String s2, String s3) {
        StringBuffer res = new StringBuffer();
        res.append(s1);
        res.append(s2);
        res.append(s3);
        return res.toString();
    }

    public String test1 (String s1, String s2, String s3) {
        StringBuilder res = new StringBuilder();
        res.append(s1);
        res.append(s2);
        res.append(s3);
        return res.toString();
    }

}
